# ==============================================================================
# 定义全局 Makefile 变量

COMMON_SELF_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
# 项目根目录
ROOT_DIR := $(abspath $(shell cd $(COMMON_SELF_DIR)/ && pwd -P))
# 构建产物,临时文件存放目录
OUTPUT_DIR := $(ROOT_DIR)/_output

CERT_X509_DIR := $(OUTPUT_DIR)/cert

# Protobuf 文件存放路径
APIROOT=$(ROOT_DIR)/pkg/proto

# ==============================================================================
# 定义Makefile all 伪目标，执行 `make` 时，会默认执行all伪目标
.PHONY: all
all: format build

# ==============================================================================
# 定义其他需要的伪目标

.PHONY: build
build: tidy # 编译源码，依赖 tidy 目标自动添加/移除依赖包.
	@go build -v -o $(OUTPUT_DIR)/jinyu cmd/jinyu/main.go

.PHONY: format
format: # 格式化 Go 源码.
	@gofmt -s -w ./

.PHONY: add-copyright
add-copyright: # 添加版权头信息.
	@addlicense -v -f $(ROOT_DIR)/scripts/boilerplate.txt $(ROOT_DIR) --skip-dirs=third_party,vendor,$(OUTPUT_DIR)

.PHONY: swagger
swagger: # 启动 swagger 在线文档。
	@swagger serve -F=swagger --no-open --port 65534 $(ROOT_DIR)/api/openapi/openapi.yaml

.PHONY: tidy
tidy: # 自动添加/移除依赖包.
	@go mod tidy

.PHONE: clean
clean: #清理构建产物、临时文件等.
	@-rm -vrf $(OUTPUT_DIR)

.PHONY: protoc
protoc: ## 编译 protobuf 文件.
	@echo "===========> Generate protobuf files"
	@protoc                                            \
		--proto_path=$(APIROOT)                          \
		--proto_path=$(ROOT_DIR)/third_party             \
		--go_out=paths=source_relative:$(APIROOT)        \
		--go-grpc_out=paths=source_relative:$(APIROOT)   \
		$(shell find $(APIROOT) -name *.proto)

.PHONY: ca
ca: ## 生成 CA 文件
	@mkdir -p $(CERT_X509_DIR)
	@openssl genrsa -out $(CERT_X509_DIR)/ca.key 4096 # 生成根证书私钥
	@openssl req -new -sha256 -out $(CERT_X509_DIR)/ca.csr -key $(CERT_X509_DIR)/ca.key -config $(CERT_X509_DIR)/ca.conf # 2. 生成请求文件
	@openssl x509 -req -days 3650 -in $(CERT_X509_DIR)/ca.csr -signkey $(CERT_X509_DIR)/ca.key -out $(CERT_X509_DIR)/ca.crt # 3. 生成根证书
	@openssl genrsa -out $(CERT_X509_DIR)/server.key 4096 # 4. 生成服务端私钥
	@openssl req -new -sha256 -out $(CERT_X509_DIR)/server.csr -key $(CERT_X509_DIR)/server.key -config $(CERT_X509_DIR)/server.conf  # 5. 生成服务端公钥
	@openssl x509 -req -days 3650 \
	-CA $(CERT_X509_DIR)/ca.crt \
	-CAkey $(CERT_X509_DIR)/ca.key \
	-CAcreateserial \
	-in $(CERT_X509_DIR)/server.csr \
	-out $(CERT_X509_DIR)/server.pem \
	-extensions req_ext \
	-extfile $(CERT_X509_DIR)/server.conf # 7. 生成服务端带有 CA 签名的证书